package cn.tonyandmoney.baidu.tts.control;

import android.content.Context;
import android.util.Log;

import com.baidu.tts.auth.AuthInfo;
import com.baidu.tts.chainofresponsibility.logger.LoggerProxy;
import com.baidu.tts.client.SpeechSynthesizer;
import com.baidu.tts.client.SpeechSynthesizerListener;
import com.baidu.tts.client.TtsMode;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import cn.tonyandmoney.baidu.Constants;
import cn.tonyandmoney.baidu.tts.utils.AutoCheck;
import cn.tonyandmoney.baidu.tts.utils.OfflineResource;
import io.reactivex.functions.Consumer;

/**
 * Created by niantuo on 2018/3/18.
 * 初始化
 */

public class TtsInit {
    private final String TAG = "TtsInit";

    private final String offlineVoice = OfflineResource.VOICE_DUYY;
    private TtsMode ttsMode = TtsMode.MIX;

    public int init(Context context,SpeechSynthesizer speechSynthesizer, SpeechSynthesizerListener listener) {
        LoggerProxy.printable(true); // 日志打印在logcat中
        Map<String, String> params = getParams(context.getApplicationContext());

        // appId appKey secretKey 网站上您申请的应用获取。注意使用离线合成功能的话，需要应用中填写您app的包名。包名在build.gradle中获取。
        InitConfig config = new InitConfig(Constants.APP_ID, Constants.APP_KEY,
                Constants.APP_SECRET, ttsMode, params, listener);

        // 上线时请删除AutoCheck的调用
//        AutoCheck.getInstance(context.getApplicationContext())
//                .check(config, new Consumer<AutoCheck>() {
//                    @Override
//                    public void accept(AutoCheck autoCheck) throws Exception {
//                        Log.i(TAG, autoCheck.obtainDebugMessage());
//                    }
//                });

        boolean isMix = config.getTtsMode().equals(TtsMode.MIX);
        speechSynthesizer.setContext(context);
        speechSynthesizer.setSpeechSynthesizerListener(config.getListener());

        speechSynthesizer.setAppId(config.getAppId());
        speechSynthesizer.setApiKey(config.getAppKey(), config.getSecretKey());

        if (isMix) {
            // 授权检测接口(只是通过AuthInfo进行检验授权是否成功。选择纯在线可以不必调用auth方法。
            AuthInfo authInfo = speechSynthesizer.auth(config.getTtsMode());
            if (!authInfo.isSuccess()) {
                // 离线授权需要网站上的应用填写包名。本demo的包名是com.baidu.tts.sample，定义在build.gradle中
                String errorMsg = authInfo.getTtsError().getDetailMessage();
                Log.i(TAG, "errMsg: " + errorMsg);
                return 1000;
            }
        }
        setParams(speechSynthesizer, config.getParams());
        // 初始化tts
        return speechSynthesizer.initTts(config.getTtsMode());
    }

    /**
     * 合成的参数，可以初始化时填写，也可以在合成前设置。
     *
     * @return
     */
    private Map<String, String> getParams(Context context) {
        Map<String, String> params = new HashMap<String, String>();
        // 以下参数均为选填
        // 设置在线发声音人： 0 普通女声（默认） 1 普通男声 2 特别男声 3 情感男声<度逍遥> 4 情感儿童声<度丫丫>
        params.put(SpeechSynthesizer.PARAM_SPEAKER, "4");
        // 设置合成的音量，0-9 ，默认 5
        params.put(SpeechSynthesizer.PARAM_VOLUME, "5");
        // 设置合成的语速，0-9 ，默认 5
        params.put(SpeechSynthesizer.PARAM_SPEED, "5");
        // 设置合成的语调，0-9 ，默认 5
        params.put(SpeechSynthesizer.PARAM_PITCH, "5");

        params.put(SpeechSynthesizer.PARAM_MIX_MODE, SpeechSynthesizer.MIX_MODE_DEFAULT);

        // 离线资源文件
        OfflineResource offlineResource = createOfflineResource(context, offlineVoice);
        // 声学模型文件路径 (离线引擎使用), 请确认下面两个文件存在
        params.put(SpeechSynthesizer.PARAM_TTS_TEXT_MODEL_FILE, offlineResource.getTextFilename());
        params.put(SpeechSynthesizer.PARAM_TTS_SPEECH_MODEL_FILE,
                offlineResource.getModelFilename());
        return params;
    }

    private OfflineResource createOfflineResource(Context context, String voiceType) {
        OfflineResource offlineResource = null;
        try {
            offlineResource = new OfflineResource(context, voiceType);
        } catch (IOException e) {
            // IO 错误自行处理
            e.printStackTrace();
        }
        return offlineResource;
    }

    private void setParams(SpeechSynthesizer synthesizer, Map<String, String> params) {
        if (params != null) {
            for (Map.Entry<String, String> e : params.entrySet()) {
                synthesizer.setParam(e.getKey(), e.getValue());
            }
        }
    }


}
